www.gusucode.com > 各种VC自绘控件源码程序 > 各种VC自绘控件源码/code/SkinSlider 自绘/SkinSlider.cpp
#include "stdafx.h" #include "../global.h" #include "JiaFilmPlayer.h" #include "JiaFilmPlayerDlg.h" #include "DlgWndPop.h" #include "skinslider.h" #include ".\skinslider.h" //#include "DlgMiniSlider.h" CSkinSlider::CSkinSlider(void) { m_bMouseOn = FALSE; m_bScrolling = FALSE; m_nAnchorTl = m_nAnchorBr = 0; //移动时对齐方式 m_bTracked = FALSE; m_bDrawSelfDown = FALSE; m_nCoveredLen = 0; m_pCovered = NULL; m_dwTimeTrack = (DWORD)-1; } CSkinSlider::~CSkinSlider(void) { /* if(m_pCovered != NULL) { delete m_pCovered; m_pCovered = NULL; }*/ m_bmpBack.DeleteObject(); m_bmpSelfDown.DeleteObject(); m_bmpNormal.DeleteObject(); m_bmpDown.DeleteObject(); if (IsWindow(m_ToolTip.GetSafeHwnd())) { m_ToolTip.DestroyWindow(); } } void CSkinSlider::LoadSlider(CString strBack, CString strSelfDown, CString strNormal, CString strDown, BOOL bHaveTooltip/* = FALSE*/) { m_bmpBack.DeleteObject(); m_bmpSelfDown.DeleteObject(); m_bmpNormal.DeleteObject(); m_bmpDown.DeleteObject(); CSize size; if(!strBack.IsEmpty()) { HBITMAP hBmp = ::LoadBitmap(theApp.m_hRes, MAKEINTRESOURCE(atoi(strBack))); m_bmpBack.Attach(hBmp); } if(!strSelfDown.IsEmpty()) { HBITMAP hBmp = ::LoadBitmap(theApp.m_hRes, MAKEINTRESOURCE(atoi(strSelfDown))); m_bmpSelfDown.Attach(hBmp); m_bDrawSelfDown = TRUE; } if(!strNormal.IsEmpty()) { HBITMAP hBmp = ::LoadBitmap(theApp.m_hRes, MAKEINTRESOURCE(atoi(strNormal))); m_bmpNormal.Attach(hBmp); } if(!strDown.IsEmpty()) { HBITMAP hBmp = ::LoadBitmap(theApp.m_hRes, MAKEINTRESOURCE(atoi(strDown))); m_bmpDown.Attach(hBmp); } ModifyStyle(WS_TABSTOP, 0); if (bHaveTooltip) { m_ToolTip.Create (this, FALSE); m_ToolTip.SetOwner (this); m_ToolTip.Hide (); SetTimer(2, 400, NULL); } } BEGIN_MESSAGE_MAP(CSkinSlider, CSliderCtrl) ON_WM_PAINT() ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() ON_WM_MOUSEMOVE() ON_WM_CAPTURECHANGED() ON_WM_KEYDOWN() ON_WM_KEYUP() ON_WM_DESTROY() ON_WM_TIMER() //ON_WM_HSCROLL() //ON_WM_VSCROLL() //ON_WM_MOUSEWHEEL() ON_WM_MOUSEWHEEL() END_MESSAGE_MAP() void CSkinSlider::OnPaint() { PAINTSTRUCT ps; // CPaintDC dc(this); // device context for painting CDC* pDC = BeginPaint(&ps); CRect rc; GetClientRect(&rc); if(m_pCovered == NULL && m_nCoveredLen < 0) CGlobal::DrawBitmap(pDC, (HBITMAP)m_bmpSelfDown, rc, TRUE); else CGlobal::DrawBitmap(pDC, (HBITMAP)m_bmpBack, rc, TRUE); if(m_bDrawSelfDown && m_pCovered != NULL && m_nCoveredLen > 0) { int nIndexStart = 0, nIndexEnd = 0; BOOL bStart = FALSE; for(int i = 0; i <= m_nCoveredLen; i ++) { if((bStart && m_pCovered[i] <= 0) )//|| i == m_nCoveredLen - 1) { bStart = FALSE; nIndexEnd = i; int nRcLeft = rc.Width() * nIndexStart / m_nCoveredLen; int nRcRight = rc.Width() * nIndexEnd / m_nCoveredLen; if(nRcLeft == 0) nRcLeft = 1; CGlobal::DrawBitmap(pDC, (HBITMAP)m_bmpSelfDown, CRect(nRcLeft, rc.top, nRcRight, rc.Height()), TRUE); } if(m_pCovered[i] > 0 && !bStart) { nIndexStart = i; bStart = TRUE; } } } CRect Tr; get_ThumbRect(Tr); if(m_bMouseOn) { CGlobal::DrawBitmap(pDC, (HBITMAP)m_bmpDown, Tr, TRUE); } else { CGlobal::DrawBitmap(pDC, (HBITMAP)m_bmpNormal, Tr, TRUE); } EndPaint(&ps); // pDC->DeleteDC(); } //******************************************************************** //函 数 名: CSkinSlider::IsEndFilmDownload //功能描述: 判断文件是否下完 //输入参数: 无 //输出参数: 无 //返 回 值: 错误码 // //修改历史: // // 1.作 者: wwd // 时 间: 2008/4/3 10:40 // 描 述: 新生成函数 //********************************************************************* BOOL CSkinSlider::IsEndFilmDownload() { int nDownload = 0; if(m_pCovered == NULL ) return TRUE; else { for(int i = m_nCoveredLen-1; i >= 0; i--) { if ( m_pCovered[i] <= 0) { return FALSE; } nDownload++; } if (nDownload == m_nCoveredLen) { return TRUE; } } return FALSE; } void CSkinSlider::OnLButtonDown(UINT nFlags, CPoint point) { CRect rc; SetCapture(); get_ThumbRect(rc); if(rc.PtInRect(point)) { m_bMouseOn = TRUE; } /*GetThumbRect(rc); if(!rc.PtInRect(point)) //默认的windows控件的thrumb会跳格前进 { SetThumb(point); } CSliderCtrl::OnLButtonDown(nFlags, point); } else*/ { //if(GetStyle() & TBS_VERT) //{ // /*void* pParent = GetParent(); // // if(((CJiaFilmPlayerDlg*)(theApp.m_pMainWnd))->m_pDlgVol == pParent) // { // CDlgVol* pDlg = (CDlgVol*)pParent; // if(pDlg != NULL) // pDlg->TrackChangePos(m_nID, SB_ENDSCROLL, GetPos()); // }*/ // //} //else { Invalidate(FALSE); SetThumb(point); #if 0 CJiaFilmPlayerDlg* pDlg = (CJiaFilmPlayerDlg*)GetParent(); if(pDlg != NULL) pDlg->TrackChangePos(m_nID, SB_ENDSCROLL, GetPos()); #else void* pParent = GetParent(); if (theApp.m_pMainWnd == pParent) { CJiaFilmPlayerDlg* pDlg = (CJiaFilmPlayerDlg*)pParent; if(pDlg != NULL) pDlg->TrackChangePos(m_nID, SB_ENDSCROLL, GetPos()); } else if(((CJiaFilmPlayerDlg*)(theApp.m_pMainWnd))->m_pDlgPop == pParent) { CDlgWndPop* pDlg = (CDlgWndPop*)pParent; if(pDlg != NULL) pDlg->TrackChangePos(m_nID, SB_ENDSCROLL, GetPos()); } else if(((CJiaFilmPlayerDlg*)(theApp.m_pMainWnd))->m_pDlgVol == pParent) { CDlgVol* pDlg = (CDlgVol*)pParent; if(pDlg != NULL) pDlg->TrackChangePos(m_nID, SB_ENDSCROLL, GetPos()); } else { ((CJiaFilmPlayerDlg*)(theApp.m_pMainWnd))->m_pminiSlider->TrackChangePos(m_nID, SB_ENDSCROLL, GetPos()); } #endif } } RedrawWindow(); //Invalidate(FALSE); m_bScrolling = TRUE; } void CSkinSlider::OnLButtonUp(UINT nFlags, CPoint point) { m_bScrolling = FALSE; Invalidate(FALSE); CJiaFilmPlayerDlg * pMainDlg = (CJiaFilmPlayerDlg*)(theApp.GetMainWnd()); #if 0 CJiaFilmPlayerDlg* pDlg = (CJiaFilmPlayerDlg*)GetParent(); if(pDlg != NULL) { if(m_bMouseOn) { if(GetStyle() & TBS_VERT) { SetThumb(point); } else { SetThumb(point); } pDlg->TrackChangePos(m_nID, SB_ENDSCROLL, GetPos()); CSliderCtrl::OnLButtonUp(nFlags, point); } } #else void* pObject = GetParent(); if (theApp.m_pMainWnd == pObject) { CJiaFilmPlayerDlg* pDlg = (CJiaFilmPlayerDlg*)pObject; if(pDlg != NULL) { if(m_bMouseOn) { if(GetStyle() & TBS_VERT) { SetThumb(point); } else { SetThumb(point); } pDlg->TrackChangePos(m_nID, SB_ENDSCROLL, GetPos()); CSliderCtrl::OnLButtonUp(nFlags, point); } } } else if(pMainDlg->m_pDlgPop == pObject) { CDlgWndPop* pDlg = (CDlgWndPop*)pObject; if(pDlg != NULL) { if(m_bMouseOn) { if(GetStyle() & TBS_VERT) { SetThumb(point); } else { SetThumb(point); } pDlg->TrackChangePos(m_nID, SB_ENDSCROLL, GetPos()); CSliderCtrl::OnLButtonUp(nFlags, point); } } } else if(pMainDlg->m_pDlgVol == pObject) { CDlgVol* pDlg = (CDlgVol*)pObject; if(pDlg != NULL) { if(m_bMouseOn) { if(GetStyle() & TBS_VERT) { SetThumb(point); } else { SetThumb(point); } pDlg->TrackChangePos(m_nID, SB_ENDSCROLL, GetPos()); CSliderCtrl::OnLButtonUp(nFlags, point); } } } else { CDlgWndPop* pDlg = (CDlgWndPop*)pObject; if(pDlg != NULL) { if(m_bMouseOn) { if(GetStyle() & TBS_VERT) { SetThumb(point); } else { SetThumb(point); } pDlg->TrackChangePos(m_nID, SB_ENDSCROLL, GetPos()); CSliderCtrl::OnLButtonUp(nFlags, point); } } } #endif m_bMouseOn = FALSE; ReleaseCapture(); } void CSkinSlider::OnMouseMove(UINT nFlags, CPoint point) { if(m_bMouseOn) { //if(GetStyle() & TBS_VERT ) { //CRect rc; //get_ThumbRect(rc); //if(rc.PtInRect(point)) //{ // GetThumbRect(rc); // if(!rc.PtInRect(point)) //默认的windows控件的thrumb会跳格前进 // { SetThumb(point); // } //} } RedrawWindow(); /*Invalidate(FALSE)*/; CJiaFilmPlayerDlg* pMainDlg = (CJiaFilmPlayerDlg*)(theApp.GetMainWnd());; #if 0 CJiaFilmPlayerDlg* pDlg = (CJiaFilmPlayerDlg*)GetParent(); if(m_bScrolling && m_bTracked) pDlg->TrackChangePos(m_nID, SB_ENDSCROLL, GetPos()); #else void* pParent = GetParent(); if (theApp.m_pMainWnd == pParent) { CJiaFilmPlayerDlg* pDlg = (CJiaFilmPlayerDlg*)pParent; if(m_bScrolling && m_bTracked) pDlg->TrackChangePos(m_nID, SB_ENDSCROLL, GetPos()); } //----------- if(pMainDlg->m_pDlgPop == pParent) { CDlgWndPop* pDlg = (CDlgWndPop*)pParent; if(pDlg != NULL) { if(m_bScrolling && m_bTracked) pDlg->TrackChangePos(m_nID, SB_ENDSCROLL, GetPos()); } } else if(pMainDlg->m_pDlgVol == pParent) { CDlgVol* pDlg = (CDlgVol*)pParent; if(pDlg != NULL) { if(m_bScrolling && m_bTracked) pDlg->TrackChangePos(m_nID, SB_ENDSCROLL, GetPos()); } } else { CDlgWndPop* pDlg = (CDlgWndPop*)pParent; if(pDlg != NULL) { if(m_bScrolling && m_bTracked) pDlg->TrackChangePos(m_nID, SB_ENDSCROLL, GetPos()); } } CJiaFilmPlayerDlg * pDlg1 = (CJiaFilmPlayerDlg*) (theApp.m_pMainWnd); if (pDlg1->m_nSeekBarRanger > 0) { static int nSkip = 0; if (nSkip ++ % 4 == 0) SetToolTipEx(TRUE); } #endif CSliderCtrl::OnMouseMove(nFlags, point); } else { BOOL bShowTooltip = FALSE; if (IsWindow(m_ToolTip.GetSafeHwnd())) { CJiaFilmPlayerDlg * pDlg = (CJiaFilmPlayerDlg*) (theApp.m_pMainWnd); if (pDlg->m_nSeekBarRanger > 0) { CRect Tr; get_ThumbRect(Tr); CPoint pos; GetCursorPos(&pos); ScreenToClient(&pos); if (Tr.PtInRect(pos)) { bShowTooltip = TRUE; SetToolTipEx(FALSE); } } if (bShowTooltip == FALSE) { m_ToolTip.Hide(); } } } } void CSkinSlider::SetToolTipEx(BOOL bCurPos/* = TRUE*/) { m_dwTimeTrack = GetTickCount(); CJiaFilmPlayerDlg * pDlg = (CJiaFilmPlayerDlg*) (theApp.m_pMainWnd); CPoint ptCursor; ::GetCursorPos (&ptCursor); ptCursor += CPoint ( GetSystemMetrics(SM_CXCURSOR)/2, GetSystemMetrics(SM_CYCURSOR)/2); CString strText; time_t tmx = bCurPos ? GetPos()/1000 : pDlg->m_nFilmpos/1000; tm * ptm = gmtime(&tmx); if (0) { int nMillSec = GetPos() % 1000; if (ptm->tm_hour > 0) strText.Format("%d:%d:%d %d", ptm->tm_hour, ptm->tm_min, ptm->tm_sec, nMillSec); else strText.Format("%d:%d %d", ptm->tm_min, ptm->tm_sec, nMillSec); } else { if (ptm->tm_hour > 0) strText.Format("%d:%d:%d", ptm->tm_hour, ptm->tm_min, ptm->tm_sec); else strText.Format("%d:%d", ptm->tm_min, ptm->tm_sec); } if (IsWindow(m_ToolTip.GetSafeHwnd())) { m_ToolTip.Track(ptCursor, strText); } } void CSkinSlider::OnCaptureChanged(CWnd *pWnd) { /* if(m_bMouseOn) { ReleaseCapture(); Invalidate(FALSE); } */ CSliderCtrl::OnCaptureChanged(pWnd); } void CSkinSlider::get_ThumbRect(CRect& r) { BITMAP bm; GetObject(m_bmpNormal, sizeof(bm), &bm); GetThumbRect(&r); if(GetStyle() & TBS_VERT) { CRect rc; GetClientRect(rc); int ny = rc.Height(); int nHarf = r.Height() / 2; r.left = 0; r.right = r.left + bm.bmWidth; if(r.top < ny / 2) { //r.top = (r.top + 0/*nHarf*/) - (bm.bmHeight / 2); //if(r.top < 0) // r.top = 0; //r.top = r.top + (ny / 8) * (ny / 2 - r.top) / ny *2; r.top -= 3; r.bottom = r.top + bm.bmHeight; } else { //r.bottom = (r.bottom - nHarf) + (bm.bmHeight / 2); // if(r.bottom > rc.bottom) // r.bottom = rc.bottom; // r.bottom = r.bottom - (ny / 8) * (abs(ny / 2 - r.bottom )) / ny *2; r.bottom += 3; r.top = r.bottom - bm.bmHeight; } if(r.top < 0) r.top = 0; } else { int nHarf = (r.Width()+1) / 2; r.top = 0; r.bottom = r.top + bm.bmHeight; r.left = (r.left + nHarf) - ((bm.bmWidth + 1)/ 2)-3;//-3播放完时滑动块显示不完整故-3 if(r.left < 0) r.left = 0; r.right = r.left + bm.bmWidth; } } BOOL CSkinSlider::SetThumb(const CPoint& point) { const int nMin = GetRangeMin(); const int nMax = GetRangeMax()+1; CRect rc; CRect rcTmp; GetClientRect(&rcTmp); GetChannelRect(rc); double dPos; double dCorrectionFactor = 0.0; if (GetStyle() & TBS_VERT) { dPos = (double)(point.y - rc.left)/(rc.right - rc.left); } else { dPos = (double)(point.x - rc.left)/(rc.right - rc.left); } dCorrectionFactor = 0.5 *(1-dPos) - 0.5 *dPos; int nNewPos = (int)(nMin + (nMax-nMin)*dPos + dCorrectionFactor); const bool bChanged = (nNewPos != GetPos()); if(bChanged) { SetPos(nNewPos); } return bChanged; } void CSkinSlider::SetPos(int nPos) { if(!m_bScrolling && !m_bMouseOn) Invalidate(FALSE); CSliderCtrl::SetPos(nPos); } void CSkinSlider::SetCoveredRanger(BYTE* pData, int nLen) { /* if(m_pCovered != NULL ) { delete m_pCovered; m_pCovered = NULL; } */ m_pCovered = pData; m_nCoveredLen = nLen; } void CSkinSlider::SetCoveredData(int nIndex) { if(nIndex <= m_nCoveredLen && m_pCovered != NULL) { m_pCovered[nIndex] = 1; } } BOOL CSkinSlider::GetCoverStatus() { return (m_pCovered == NULL && m_nCoveredLen == 0); } void CSkinSlider::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { // CSliderCtrl::OnKeyDown(nChar, nRepCnt, nFlags); } void CSkinSlider::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) { // CSliderCtrl::OnKeyUp(nChar, nRepCnt, nFlags); } void CSkinSlider::OnDestroy() { if (IsWindow(m_ToolTip.GetSafeHwnd())) { KillTimer(2); } CSliderCtrl::OnDestroy(); // TODO: 在此处添加消息处理程序代码 } void CSkinSlider::OnTimer(UINT nIDEvent) { // TODO: 在此添加消息处理程序代码和/或调用默认值 if (nIDEvent == 1) { } else if (nIDEvent == 2) { DWORD dwTimeTrack = GetTickCount(); if (dwTimeTrack - m_dwTimeTrack > 800) { if (IsWindow(m_ToolTip.GetSafeHwnd())&& m_ToolTip.IsWindowVisible()) { m_ToolTip.Hide(); } m_dwTimeTrack = GetTickCount(); } } CSliderCtrl::OnTimer(nIDEvent); } //void CSkinSlider::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) //{ // // TODO: 在此添加消息处理程序代码和/或调用默认值 // // CSliderCtrl::OnHScroll(nSBCode, nPos, pScrollBar); //} //void CSkinSlider::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) //{ // // TODO: 在此添加消息处理程序代码和/或调用默认值 // DT("OnVScroll"); // if(GetStyle() & TBS_VERT ) // { // CRect rc; // CPoint point; // GetCursorPos(&point); // get_ThumbRect(rc); // if(rc.PtInRect(point)) // { // GetThumbRect(rc); // if(!rc.PtInRect(point)) //默认的windows控件的thrumb会跳格前进 // { // SetThumb(point); // } // // } // ReleaseCapture(); // } // // CSliderCtrl::OnVScroll(nSBCode, nPos, pScrollBar); //} BOOL CSkinSlider::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) { // TODO: 在此添加消息处理程序代码和/或调用默认值 //if(GetStyle() & TBS_VERT ) //{ // CRect rcThumb; // get_ThumbRect(rcThumb); // CRect rc; // GetClientRect(&rc); // DT("rcThumb:%d", rcThumb.bottom ); // CPoint point; // point.x =rcThumb.left+1; // int a =rcThumb.top - zDelta/30; // if (a == 13 ) // { // a += 2; // } // if( a >= 0 && a< rc.bottom) // { // DT("a :%d", a ); // // point.y = a; // } // else // { // if (zDelta>0) // { // DT("zDelta>0" ); // point.y = 0; // } // else if(zDelta<0) // { // DT("zDelta<<0" ); // point.y = rc.bottom; // } // else // { // DT("zDelta==0" ); // } // } // DT("mousewheel"); // if(rc.PtInRect(point)) // { // //GetThumbRect(rc); // //if(!rc.PtInRect(point)) //默认的windows控件的thrumb会跳格前进 // { // SetThumb(point); // DT("%d",point.y); // } // } // void* pParent = GetParent(); // CJiaFilmPlayerDlg* pMainDlg = (CJiaFilmPlayerDlg*)(theApp.GetMainWnd());; // // if(pMainDlg->m_pDlgVol == pParent) // { // CDlgVol* pDlg = (CDlgVol*)pParent; // if(pDlg != NULL) // { // if(m_bScrolling && m_bTracked) // pDlg->TrackChangePos(m_nID, SB_ENDSCROLL, GetPos()); // } // } // if (pMainDlg->m_nSeekBarRanger > 0) // { // static int nSkip = 0; // if (nSkip ++ % 4 == 0) // SetToolTipEx(TRUE); // } // // //ReleaseCapture(); //} //return CSliderCtrl::OnMouseWheel(nFlags, zDelta, pt); return true; }